package cn.wolfcode.trip.admin.shiro;

import cn.wolfcode.trip.base.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/**
 * @author by mycp
 * @Classname MyFormAuthenticationFilter
 * @Description TODO
 * @Date 2018/10/24 0:19
 */
public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
    /**
     * 登录成功
     * @param token
     * @param subject
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
                                     ServletRequest request, ServletResponse response) throws Exception {
        // 为什么要复写这两个方法
        // 1. 因为我们需要返回的是json的数据, 而默认的是重定向, 而ajax是无法重定向的
        // 如何返回json--使用response
        // 设置响应给浏览器的数据类型是json格式
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().print(JSON.toJSONString(new JsonResult()));
        // 不放行, 只返回json数据, 这是我们所关心的
        return false;
    }

    /**
     * 登录失败
     * @param token
     * @param e
     * @param request
     * @param response
     * @return
     */
    @Override
    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e,
                                     ServletRequest request, ServletResponse response) {
        // 打印异常信息
        e.printStackTrace();
        JsonResult result = new JsonResult();
        if (e instanceof UnknownAccountException){
            result.mark("用户名不存在!");
        } else if (e instanceof IncorrectCredentialsException){
            result.mark("密码错误!");
        }
        try {
            // 设置响应给浏览器的数据类型是json格式
            response.setContentType("text/json;charset=utf-8");
            response.getWriter().print(JSON.toJSONString(result));
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        // 不放行, 因为已经确定要给浏览器返回什么类型
        return false;
    }
}
